#ifndef KEYNODE_H_
#define KEYNODE_H_

#include "../Externa/Clave.h"
#include <set>
#include <vector>

using namespace std;

class KeyNode;

struct Comparador {
  bool operator()(Clave* c1, Clave* c2){
	  return (*c1 < *c2);
  }
};

class KeyNode : public set<Clave*, Comparador> {

	public:
		//Constructor
		KeyNode();

		//Destructor
		virtual ~KeyNode();

		//Devuelve
		//un puntero a la clave buscada (si la encuentra)
		//un puntero a la clave inmediatamente anterior (clave menor a la buscada)
		//NULL si la clave es menor a todas las claves del conjunto.
		Clave* findClave(Clave* clave);

		Clave* findClaveAnterior(Clave* clave);

		Clave* findClaveSiguiente(Clave* clave);

		//Divide al conjunto actual en dos y se queda con la menor cantidad de claves.
		//Devuelve un KeyNode con las claves mayores
		KeyNode* splitBSharp(unsigned short minClaves, unsigned short maxClaves, bool hoja);

		//Une este keyNode con un keyNode hermano y con una clave padre.
		void merge(KeyNode* keyNode, Clave* c1, Clave* c2);

		//Une este keyNode con dos keyNodes hermanos y con una clave padre.
		void merge(KeyNode* keyNode1, KeyNode* keyNode2, Clave* c1, Clave* c2);

		//Sobrecarga del operador = para que al copiar el conjunto también copie las claves
		KeyNode& operator = (KeyNode& keyNode);

};
#endif /* KEYNODE_H_ */
